import { z } from 'zod';

// Example 创建时的校验模式
export const createExampleSchema = z.object({
  title: z.string({
    required_error: '标题是必需的',
    invalid_type_error: '标题必须是字符串',
  })
    .min(1, '标题不能为空')
    .max(100, '标题长度不能超过100个字符')
    .trim(),

  content: z.string({
    invalid_type_error: '描述必须是字符串',
  })
    .max(500, '描述长度不能超过500个字符')
    .trim()
    .optional(),

  completed: z.boolean({
    invalid_type_error: '完成状态必须是布尔值',
  })
    .default(false)
    .optional(),
});

// Example 更新时的校验模式（所有字段都是可选的）
export const updateExampleSchema = z.object({
  title: z.string({
    invalid_type_error: '标题必须是字符串',
  })
    .min(1, '标题不能为空')
    .max(100, '标题长度不能超过100个字符')
    .trim()
    .optional(),

  content: z.string({
    invalid_type_error: '描述必须是字符串',
  })
    .max(500, '描述长度不能超过500个字符')
    .trim()
    .optional(),

  completed: z.boolean({
    invalid_type_error: '完成状态必须是布尔值',
  })
    .optional(),
});

// 查询参数校验模式
export const queryExampleSchema = z.object({
  page: z.string()
    .regex(/^\d+$/, '页码必须是数字')
    .transform(Number)
    .refine(val => val > 0, '页码必须大于0')
    .default('1'),

  limit: z.string()
    .regex(/^\d+$/, '每页数量必须是数字')
    .transform(Number)
    .refine(val => val > 0 && val <= 100, '每页数量必须在1-100之间')
    .default('10'),

  completed: z.string()
    .transform(val => val === 'true')
    .optional(),

  search: z.string()
    .max(50, '搜索关键词长度不能超过50个字符')
    .trim()
    .optional(),
});

// MongoDB ObjectId 校验模式
export const objectIdSchema = z.string({
  required_error: 'ID是必需的',
  invalid_type_error: 'ID必须是字符串',
})
  .regex(/^[0-9a-f]{24}$/i, '无效的ID格式');

// 导出类型定义
export type CreateExampleInput = z.infer<typeof createExampleSchema>;
export type UpdateExampleInput = z.infer<typeof updateExampleSchema>;
export type QueryExampleInput = z.infer<typeof queryExampleSchema>;
export type ObjectIdInput = z.infer<typeof objectIdSchema>;
